import router, { asyncRoutes } from './router'// 导入路由和动态路由
import store from './store'// 导入vuex仓库
// import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar 进度条插件
import 'nprogress/nprogress.css' // progress bar style 进度条样式
// import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'

// 白名单
const whiteList = ['/login', '/404']

// token前置守卫
router.beforeEach(async(to, from, next) => {
  // 显示进度条
  NProgress.start()

  // 获取token
  const token = store.state.user.token
  // 判断是否有token
  if (token) {
    // 如果有token,判断是否是去登录页面
    if (to.path === '/login') {
      // 如果是去登录页面,直接跳转到主页
      next('/')
    } else {
      // 将当前路由存到自定义属性中
      router.myRouter = to.fullPath
      // // 对用户id进行判断,如果有用户id,那么
      // if (store.getters.userId) next()
      //
      // await store.dispatch('user/getUserInfo')
      //
      // router.addRoutes(asyncRoutes)
      // 对用户id进行判断,如果没有用户id
      if (!store.getters.userId) {
        // 如果存在token,并且成功获取数据之后,调用vuex里的actions里的getUserInfo方法,拿到用户信息
        const menus = await store.dispatch('user/getUserInfo')
        // 再将所有的动态路由进行遍历,拿到返回后的动态路由(当前用户里的动态路由)
        const filterList = asyncRoutes.filter(item => {
          // 当有用户信息里的menus属性里有与动态路由里一样的名字时返回true
          return menus.includes(item.children[0].name)
        })
        // 将动态路由添加到路由中
        router.addRoutes(filterList)
        // 路由设置中的404页处在中间位置，而不是所有路由的末尾了，`path:'*'` 导致可以匹配任意页面
        filterList.push(
          { path: '*', redirect: '/404', hidden: true }
        )
        // 1.  `this.$router.options.routes` 这个数据是固定
        // 2.  而通过 addRoutes 添加的路由表只存在内存中，并不会改变`this.$router.options.routes`
        // 将动态路由传递给permission里的mutation方法,进行合并
        store.commit('permission/setRoutes', filterList)
        // 解决刷新出现的白屏bug
        next({
          path: to.fullPath, // 保证路由添加完了再进入页面 (可以理解为重进一次)
          replace: true// 重进一次, 不保留重复历史
        })
      } else {
        // 渠道最终的路由(静态路由+筛选好的动态路由)
        let allPath = store.state.permission.routes.map(item => item.path)

        // 定义白名单
        const otherPath = [
          '/dashboard',
          '/employees/detail'
        ]

        // 将白名单和最终的路由进行合并
        allPath = [...allPath, ...otherPath]
        console.log(allPath)
        // 判断即将要进入的路由是否在合并后的最终路由中
        if (!allPath.includes(to.path)) {
          // 判断url中是否有跳转之前的地址,如果有就跳转到首页
          if (router.myRouter) {
            next('/')
          } else {
            next('/404')
          }
        } else {
          // 如果有用户id,那么直接放行

          next()
        }
      }
    }
  } else {
    // 如果没有token,判断是否在白名单
    if (whiteList.indexOf(to.path) !== -1) {
      // 如果在白名单里直接放行
      next()
    } else {
      // 如果不在白名单里,跳转到登录页面
      next('/login')
    }
  }
  // 隐藏进度条
  NProgress.done()
})

// 标题前置守卫
router.beforeEach(async(to, from, next) => {
  // 将元信息里的token通过to获取到,并且赋值给document的title属性
  document.title = getPageTitle(to.meta.title)
  // 然后直接放行
  next()
})
// 后置守卫
router.afterEach((to, from) => {
  // 隐藏进度条
  NProgress.done()
})
// NProgress.configure({ showSpinner: false }) // NProgress Configuration

// const whiteList = ['/login'] // no redirect whitelist

// router.beforeEach(async(to, from, next) => {
//   // start progress bar
//   NProgress.start()

//   // set page title
//   document.title = getPageTitle(to.meta.title)

//   // determine whether the user has logged in
//   const hasToken = getToken()

//   if (hasToken) {
//     if (to.path === '/login') {
//       // if is logged in, redirect to the home page
//       next({ path: '/' })
//       NProgress.done()
//     } else {
//       const hasGetUserInfo = store.getters.name
//       if (hasGetUserInfo) {
//         next()
//       } else {
//         try {
//           // get user info
//           await store.dispatch('user/getInfo')

//           next()
//         } catch (error) {
//           // remove token and go to login page to re-login
//           await store.dispatch('user/resetToken')
//           Message.error(error || 'Has Error')
//           next(`/login?redirect=${to.path}`)
//           NProgress.done()
//         }
//       }
//     }
//   } else {
//     /* has no token*/

//     if (whiteList.indexOf(to.path) !== -1) {
//       // in the free login whitelist, go directly
//       next()
//     } else {
//       // other pages that do not have permission to access are redirected to the login page.
//       next(`/login?redirect=${to.path}`)
//       NProgress.done()
//     }
//   }
// })

// router.afterEach(() => {
//   // finish progress bar
//   NProgress.done()
// })
